package com.hippoDocker.security.util;

import cn.hutool.core.util.StrUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Auther: tangxl
 * @Date: 2021年11月30日14:47:01
 * @Description: Token生成工具类
 */
public class JwtUtil {
    //失效时间(与redis失效时间相同)--24小时
    private static final long expireTime = 24*60*60*1000;
    //密钥明文
    private static final String privateKey = "hippoDocker";

    /**
     * 生成UUID唯一序列
     * @return
     */
    public static String getUUID(){
        String token = StrUtil.uuid().replaceAll("-","");
        return token;
    }

    /**
     * 签名生成（JWT生成Token）
     * @param expireTime 有效时间 分钟
     * @return
     */
    public static String createJWT(String id, Long expireTime){
        if (expireTime == null) {
            expireTime = JwtUtil.expireTime;
        }
        Map<String,Object> header = new HashMap<>();
        header.put("typ","jwt");
        header.put("alg","HS256");
        Map<String, Object> claims = new HashMap<>();
        //自定义有效载荷部分
        String uuid = getUUID();
        claims.put("uuid",uuid);
        claims.put("id",id);
        String jwt = Jwts.builder()
                //发证人
                .setIssuer("auth")
                //Jwt头
                .setHeader(header)
                //有效载荷
                .setClaims(claims)
                //设定签发时间
                .setIssuedAt(new Date())
                //设定过期时间
                .setExpiration(new Date(System.currentTimeMillis() + expireTime))
                //使用HS256算法签名，PRIVATE_KEY为签名密钥
                .signWith(SignatureAlgorithm.HS256,privateKey)
                .compact();
        return jwt;
    }

    /**
     * JWT解密
     * @param token
     * @return
     */
    public static String parseJWT(String token){
        //获取DefaultJwtParser
        try{
           Claims claims = Jwts.parser()
                    //设置 密钥
                    .setSigningKey(privateKey)
                    //设置需要解析的 token
                    .parseClaimsJws(token).getBody();
           String parsedJWT = claims.get("id",String.class);
           return parsedJWT;
        }catch (Exception e){
            return null;
        }
    }

    //测试
    public static void main(String[] args) {
        String token = createJWT("admin",null);
        System.out.println(token);
    }
}
